﻿using LxBasic;

namespace LxCore
{
    //注意，不要改成struct，因为struct传参时会复制，因此不会改变记录
    public class ToDoState
    {
        public ToDoState(bool isOnceOrAlways, bool isToDoOrDone = true)
        {
            if (isOnceOrAlways)
            {
                if (isToDoOrDone)
                {
                    flag = 0;
                }
                else
                {
                    flag = -1;
                }
            }
            else
            {
                flag = -2;
            }
        }
        //Flag规定：[-2:Always],[-1:DoneOnce],[0:ToDoOnce],[1~N:记录多线程完成的数量]
        private volatile int flag;
        public bool GetIsToDo()
        {
            return flag != -1;
        }
        public void SetDoneOnce(ThreadInfo tInfo)
        {
            if (flag >= 0)
            {
                if (Interlocked.Increment(ref flag) == tInfo.TotalThreadsCount)
                {
                    flag = -1;
                }
            }
        }

    }

}
//public class ToDoState
//{
//    public ToDoState(bool isOnceOrAlways, bool isToDoOrDone = true)
//    {
//        if (isOnceOrAlways)
//        {
//            if (isToDoOrDone)
//            {
//                state = StateTypes.ToDoOnce;
//            }
//            else
//            {
//                state = StateTypes.DoneOnce;
//            }            
//        }
//        else
//        {
//            state = StateTypes.AlwaysToDo;
//        }
//    }

//    private volatile StateTypes state = StateTypes.AlwaysToDo;

//    public bool GetIsToDo()
//    {
//        return state != StateTypes.DoneOnce;
//    }
//    public void SetDoneOnce(ThreadInfo threadInfo)
//    {
//        if(state == StateTypes.ToDoOnce)
//        {
//            MultiThreads.Sync(threadInfo, () => { state = StateTypes.DoneOnce; });
//        }
//    }
//    private enum StateTypes : byte
//    {
//        AlwaysToDo,
//        ToDoOnce,
//        DoneOnce,
//    }
//}
//protected void SetStateDone()
//{
//    if (_State == StateTypes.ToDoOnce)
//    {
//        _State = StateTypes.DoneOnce;
//    }
//}
//public bool GetIsNeedToDo(ThreadInfo threadInfo)
//{
//    switch (_State)
//    {
//        case StateTypes.ToDoOnce:
//            MultiThreads.Sync(threadInfo, SetStateDone);
//            return true;
//        case StateTypes.DoneOnce:
//            return false;
//        case StateTypes.AlwaysToDo:
//        default:
//            return true;
//    }
//}